package org.wheel.plugins.toolkit.sql.plugin;

import cn.hutool.core.lang.Pair;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public final class RuleDataHolder {
    /** 线程级 Map<ruleName, 任意数据> */
    private static final ThreadLocal<Map<String, Object>> STORE =
            ThreadLocal.withInitial(HashMap::new);

    /** 写：业务代码 / 拦截器调用 */
    public static void put(String ruleName, Object data) {
        STORE.get().put(ruleName, data);
    }

    /**
     * 判断当前线程是否包含指定规则数据
     * @param ruleName
     * @return
     */
    public static boolean containsKey(String ruleName) {
        return STORE.get().containsKey(ruleName);
    }

    /**
     * 读：规则插件调用
     * @param ruleName 规则名称
     * @return 规则数据 返回的数据结构,建议最好是 {@code List<Pair<ColumnRef, Object>} 键值对，key 是传入sql中的字段名，带表别名设置 ，value 是传入sql中的参数值。
     *          如果是单个参数，则返回 Pair 键值对即可。
     */
    public static <T> T get(String ruleName) {
        return (T) STORE.get().get(ruleName);
    }

    /** 读整个 Map（批量规则） */
    public static Map<String, Object> getAll() {
        return Collections.unmodifiableMap(STORE.get());
    }

    /** 清理当前线程 */
    public static void clear() {
        STORE.remove();
    }
}